/**
 * @class WebOs.Kernel.Core
 * @markdown Kernel与外部应用交互接口，继承实现了CoreBase
 */

Ext.define('WebOs.Kernel.Core', {
	version : 1.0,
	extend : 'WebOs.Kernel.CoreBase',

	systemCache : new Ext.util.MixedCollection(),

	mixins : {
		observable : 'Ext.util.Observable'
	},

	constructor : function(config) {
		var me = this;
		me.mixins.observable.constructor.call(this, config);
		me.addEvents('userlogin',  			//登陆成功 
					'servicemounted', 		//服务挂载后
					'viewinited',			//展示框架初始化完成
					'beforeviewchange', 	//展示框架切换前
					'beforeservicedisplay', //展示业务前 
					'servicedisplayed',		//展示业务后
					'beforecloseui', 		//关闭展示业务前
					'afteruiclosed',		//关闭展示业务后
					'repeatstartservice'	//重复启动某个服务   
				);
		me.callParent(config);
	},

	/**
	 * 用户登陆接口
	 * 
	 * @param {}
	 *            name
	 * @param {}
	 *            pass
	 * @return {Boolean}
	 */
	login : function(name, pass,vcode, success, error) {
		var me = this;
		if (!name || !pass || !vcode) {
			return false;
		} else {
			if (success && typeof success == 'function') {
				this.addListener('userlogin', success);
			}
			if (error && typeof error == 'function') {
				me.umgr.login(name, pass,vcode, error);
			} else {
				me.umgr.login(name, pass,vcode, Ext.emptyFn);
			}
		}
	},
	getUser : function(){
		var me = this;
		return me.umgr.getActiveUser();
	},
	
	/**
	 * 用户登出接口
	 */
	logout : function() {
		this.umgr.logout(function(){
			window.location.reload();
		});
	},
	/**
	 * 检验用户是否已经登陆，即服务端是否保存用户session
	 * 
	 * @return {}
	 */
	checkLogin : function(yes, no) {
		if (!yes || typeof yes != 'function') {
			yes = Ext.emptyFn;
		}
		if (!no || typeof no != 'function') {
			no = Ext.emptyFn;
		}
		this.umgr.checkLogin(yes, no);
	},
	/**
	 * 获取用户的services(即业务和权限信息),保存到客户端文件系统中
	 */
	initUserService : function() {
		var me = this;
		me.checkLogin(function() {
					me.umgr.getUserService();
					me.umgr.addListener('userserviceloaded',function(services){
						me.mountUserService(services);
						me.fireEvent('servicemounted',services);
					})
				}, function() {
					console.log('[ERROR]', 'must login first!');
				})
	},
	/**
	 * 获取业务模块的store
	 * 
	 * @return {}
	 */
	getUserServiceStore : function() {
		return this.umgr.moduleStore;
	},

	/**
	 * 检验当前用户是否含有service,action对应的权限
	 * 
	 * @param {}
	 *            service
	 * @param {}
	 *            action
	 * @return {}
	 */
	checkPermission : function(service, action) {
		return this.pmgr.hasActionPermission(service, action);
	},

	/**
	 * 初始化viewframework ,决定加载viewframeword的优先级依次为: url参数-> 用户cookie->
	 * initd.js中的默认vframeser
	 */
	initView : function() {
		var me = this;
		if (me.getActiveView()) {
			return;
		}
		var vfName = null;
		var params = getLocationParameters();

		if (params && params[Constants.URL_PARAMETER_VIEW]) {
			vfName = params[Constants.URL_PARAMETER_VIEW];
		} else if (me.umgr.getUserLocalData(Constants.USER_COOKIE_VIEW)) {
			vfName = me.umgr.getUserLocalData(Constants.USER_COOKIE_VIEW);
		} else {
			vfName = me.vmgr.vframeser_raw.name;
		}
		// 启动viewFramework
		// TODO 加载vf对应css
		me.vmgr.initVFrame(vfName);
		
		me.fireEvent('viewinited',me.getActiveView());
	},
	/**
	 * 获取当前正在运行的展示框架
	 * 
	 * @return {}
	 */
	getActiveView : function() {
		return this.vmgr.getActiveFrame();
	},
	/**
	 * 切换展示框架 流程: 在URL上拼接参数 -> 将新view存入cookie中 ->刷新页面
	 * 
	 * @param {}
	 *            newView
	 */
	changeView : function(newView) {
		var me = this;
		if (!newView || typeof newView != 'string') {
			log()
		}
		if(!me.fireEvent('beforeviewchange',me.getActiveView(),newView)){
			return;
		}
		
		var url = window.location.href;
		url = setUrlParameter(url, Constants.URL_PARAMETER_VIEW, newView);
		me.umgr.setUserLocalData(Constants.USER_COOKIE_VIEW, newView);
		window.location.href = url;
	},
	
	/**
	 * 获取所有展示框架
	 */
	getAllViews : function(){
		var me = this;
		return me.vmgr.all_views;
	},

	/**
	 * 以当前的展示框架展示service对应的业务内容
	 * 
	 * @param {}
	 *            service service类名或者service对象
	 */
	display : function(service, config) {

		var me = this;
		var vf = me.getActiveView();
		if (!vf) {
			log('[Error]', 'no viewFramework is active!');
			return;
		}
		if (typeof service == 'object') {
			if(me.fireEvent('beforeservicedisplay',service)){
				me.smgr.startServiceByServiceFile(service,config);
			}
			
		} else if (typeof service == 'string') {
			var serviceObj = me.sfs.getFileByKey(service);
			if(me.fireEvent('beforeservicedisplay',serviceObj)){
				me.smgr.startServiceByServiceFile(serviceObj,config);
			}
		} else {
			log('[Error]', 'incorrect service value type!');
		}
	},
	
	
	
	closeUI : function(service){
		var me = this;
		var vf = me.getActiveView();
		if (!vf) {
			log('[Error]', 'no viewFramework is active!');
			return;
		}
		if (typeof service == 'object') {
			if(me.fireEvent('beforecloseui',service)){
				me.smgr.stopServiceByServiceFile(service);
			}
		} else if (typeof service == 'string') {
			var serviceObj = me.sfs.getFileByKey(service);
			if(me.fireEvent('beforecloseui',serviceObj)){
				me.smgr.stopServiceByServiceFile(serviceObj);
			}
		} else {
			log('[Error]', 'incorrect service value type!');
		}
	},

	/**
	 * 存储用户数据到cookie中,形式如： userName@key=value
	 * 
	 * @param {}
	 *            key
	 * @param {}
	 *            value
	 */
	setUserData : function(key, value) {
		if (key) {
			this.umgr.setUserLocalData(key, value);
		} else {
			log('[warn]', 'key cannot be null')
		}
	},
	/**
	 * 从cookie中获取用户数据,只获取当前登陆用户的数据
	 * 
	 * @param {}
	 *            key
	 * @return {}
	 */
	getUserData : function(key) {
		if (key) {
			return this.umgr.getUserLocalData(key);
		} else {
			return null;
		}
	},
	/**
	 * 将数据以key-value的形式缓存到js内存中
	 * 
	 * @param {}
	 *            key
	 * @param {}
	 *            object
	 */
	setCache : function(key, object) {
		if (key) {
			this.systemCache.add(key, object);
		} else {
			log('[warn]', 'key cannot be null')
		}
	},
	/**
	 * 通过key过去缓存数据
	 * 
	 * @param {}
	 *            key
	 * @return {}
	 */
	getCache : function(key) {
		if (key) {
			return this.systemCache.get(key)
		} else {
			return null;
		}
	}
});